{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import math\n",
    "import torch.nn.functional as F\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import itertools\n",
    "import pickle\n",
    "import os\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")\n",
    "\n",
    "from collections import OrderedDict\n",
    "plt.ion()\n",
    "from copy import deepcopy\n",
    "from PIL import Image\n",
    "from datetime import datetime\n",
    "\n",
    "from torch.optim import lr_scheduler, Adam\n",
    "import torch\n",
    "from torch.cuda import empty_cache\n",
    "from torchvision import models\n",
    "import torchvision.transforms.functional as TF\n",
    "import torch.nn.functional as F\n",
    "import torch.optim as optim\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "from torch.autograd import no_grad, Function, grad\n",
    "from torch import nn\n",
    "from torch.utils.data import Dataset, DataLoader, SubsetRandomSampler\n",
    "from torch.nn import MaxPool2d\n",
    "\n",
    "\n",
    "date = datetime.now().strftime('%Y-%m-%d')\n",
    "path = 'results_pytorch_memory/'+date\n",
    "if not(os.path.exists(path)):\n",
    "    os.makedirs(path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DatasetProcessing(Dataset): #Data must be wrapped on a Dataset parent class where the methods __getitem__ and __len__ must be overrided. Note that,the data is not loaded on memory by now.\n",
    "    \n",
    "    def __init__(self, data, target, transform=None): #used to initialise the class variables - transform, data, target\n",
    "        self.transform = transform\n",
    "        \n",
    "        if data.shape[1] == 28:   # in this case data is a mnist like dataset \n",
    "            self.data = data.astype(np.uint8)[:,:,:,None]  # .reshape((-1,28,28))\n",
    "        else:  # in this case data is other embedded tasks (cifar, kmnist...)\n",
    "            self.data = data.astype(np.float32)[:,:,None] \n",
    "        self.target = torch.from_numpy(target).long() # needs to be in torch.LongTensor dtype\n",
    "   \n",
    "    def __getitem__(self, index): #used to retrieve the X and y index value and return it\n",
    "        \n",
    "        if self.transform is not None:\n",
    "            return self.transform(self.data[index]), self.target[index]\n",
    "        else:\n",
    "            return self.data[index], self.target[index]\n",
    "    \n",
    "    def __len__(self): #returns the length of the data\n",
    "        return len(list(self.data))\n",
    "    \n",
    "    \n",
    "class SignActivation(Function): # We define a sign activation with derivative equal to clip\n",
    "\n",
    "    @staticmethod\n",
    "    def forward(ctx, i):\n",
    "        result = i.sign()\n",
    "        ctx.save_for_backward(i)\n",
    "        return result\n",
    "\n",
    "    @staticmethod\n",
    "    def backward(ctx, grad_output):\n",
    "        i, = ctx.saved_tensors\n",
    "        grad_i = grad_output.clone()\n",
    "        grad_i[i.abs() > 1.0] = 0\n",
    "        return grad_i\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a u t o m o b i l e\n"
     ]
    }
   ],
   "source": [
    "transform_cifar10_train = transforms.Compose(\n",
    "    [transforms.Resize(220),\n",
    "     #torchvision.transforms.RandomChoice([torchvision.transforms.RandomRotation(10), torchvision.transforms.RandomCrop((32,32), padding=4, padding_mode = 'edge')]),\n",
    "     transforms.RandomCrop(200),\n",
    "     #torchvision.transforms.RandomCrop((32,32), padding=5, padding_mode = 'edge'),\n",
    "     transforms.RandomHorizontalFlip(p=0.5),\n",
    "     transforms.ToTensor(), transforms.Normalize(mean=(0.0,), std=(1.0,))]) \n",
    "\n",
    "transform_cifar10_test = transforms.Compose(\n",
    "    [transforms.Resize(220), \n",
    "     transforms.CenterCrop(200),\n",
    "     transforms.ToTensor(), transforms.Normalize(mean=(0.0,), std=(1.0,))]) \n",
    "\n",
    "\n",
    "cifar10_train_dset = torchvision.datasets.CIFAR10('./cifar10_pytorch', train=True, transform=transform_cifar10_train, download=False)\n",
    "cifar10_train_loader = torch.utils.data.DataLoader(cifar10_train_dset, batch_size=500, shuffle=False, num_workers=0)\n",
    "\n",
    "cifar10_test_dset = torchvision.datasets.CIFAR10('./cifar10_pytorch', train=False, transform=transform_cifar10_test, download=False)\n",
    "cifar10_test_loader = torch.utils.data.DataLoader(cifar10_test_dset, batch_size=500, shuffle=False, num_workers=0)\n",
    "\n",
    "classes = ['airplane', 'automobile', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck']\n",
    "\n",
    "def imshow(img):\n",
    "    #img = img / 2 + 0.5     # unnormalize\n",
    "    npimg = img.numpy()\n",
    "    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# get some random training images\n",
    "dataiter = iter(cifar10_train_loader)\n",
    "images, labels = dataiter.next()\n",
    "rnd_idx = 60 #np.random.randint(100)\n",
    "\n",
    "# show images\n",
    "imshow(torchvision.utils.make_grid(images[rnd_idx], nrow=8))\n",
    "# print labels\n",
    "print(' '.join('%5s' % classes[labels[rnd_idx]]))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "forest\n"
     ]
    }
   ],
   "source": [
    "transform_cifar100_train = transforms.Compose(\n",
    "    [transforms.Resize(220),\n",
    "     #torchvision.transforms.RandomChoice([torchvision.transforms.RandomRotation(10), torchvision.transforms.RandomCrop((32,32), padding=4, padding_mode = 'edge')]),\n",
    "     transforms.RandomCrop(200),\n",
    "     #torchvision.transforms.RandomCrop((32,32), padding=5, padding_mode = 'edge'),\n",
    "     transforms.RandomHorizontalFlip(p=0.5),\n",
    "     transforms.ToTensor(), transforms.Normalize(mean=(0.0,), std=(1.0,))]) \n",
    "\n",
    "transform_cifar100_test = transforms.Compose(\n",
    "    [transforms.Resize(220), \n",
    "     transforms.CenterCrop(200),\n",
    "     transforms.ToTensor(), transforms.Normalize(mean=(0.0,), std=(1.0,))]) \n",
    "\n",
    "\n",
    "cifar100_train_dset = torchvision.datasets.CIFAR100('./cifar100_pytorch', train=True, transform=transform_cifar100_train, download=False)\n",
    "cifar100_train_loader = torch.utils.data.DataLoader(cifar100_train_dset, batch_size=500, shuffle=False, num_workers=0)\n",
    "\n",
    "cifar100_test_dset = torchvision.datasets.CIFAR100('./cifar100_pytorch', train=False, transform=transform_cifar100_test, download=False)\n",
    "cifar100_test_loader = torch.utils.data.DataLoader(cifar100_test_dset, batch_size=500, shuffle=False, num_workers=0)\n",
    "\n",
    "pickleFile = open(\"./cifar100_pytorch/cifar-100-python/meta\", 'rb')\n",
    "dic = pickle.load(pickleFile)\n",
    "pickleFile.close()\n",
    "\n",
    "classes = dic['fine_label_names']\n",
    "\n",
    "print(len(cifar100_test_dset))\n",
    "\n",
    "def imshow(img):\n",
    "    #img = img / 2 + 0.5     # unnormalize\n",
    "    npimg = img.numpy()\n",
    "    plt.imshow(np.transpose(npimg, (1, 2, 0)))\n",
    "    plt.show()\n",
    "\n",
    "\n",
    "# get some random training images\n",
    "dataiter = iter(cifar100_train_loader)\n",
    "images, labels = dataiter.next()\n",
    "rnd_idx = np.random.randint(100)\n",
    "\n",
    "\n",
    "# show images\n",
    "imshow(torchvision.utils.make_grid(images[rnd_idx], nrow=8))\n",
    "# print labels\n",
    "print(classes[labels[rnd_idx]])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([500000, 512]) torch.Size([500000]) torch.Size([10000, 512]) torch.Size([10000])\n"
     ]
    }
   ],
   "source": [
    "# Extracting features of cifar10 with conv layers of resnet pretrained on imagenet\n",
    "\n",
    "train_loader = cifar100_train_loader\n",
    "test_loader = cifar100_test_loader\n",
    "\n",
    "resnet = models.resnet18(pretrained = True)\n",
    "resnet_conv = nn.Sequential(*list(resnet.children())[:-1])\n",
    "\n",
    "for param in resnet_conv.parameters():\n",
    "    param.requires_grad = False\n",
    "\n",
    "resnet_conv.cuda()\n",
    "\n",
    "features_train = []\n",
    "target_train = []\n",
    "for i in range(10):\n",
    "    for idx, (data, target) in enumerate(train_loader):\n",
    "        data = data.to('cuda')\n",
    "        target = target.to('cuda')\n",
    "        features = resnet_conv(data)\n",
    "#        print(features.shape)\n",
    "        features = torch.squeeze(features)\n",
    "        features_train.append(features)\n",
    "        target_train.append(target)\n",
    "    \n",
    "\n",
    "features_dset_train = torch.cat(features_train,0)\n",
    "target_dset_train = torch.cat(target_train, 0)\n",
    "\n",
    "features_test = []\n",
    "target_test = []\n",
    "\n",
    "for idx, (data, target) in enumerate(test_loader):\n",
    "    data = data.to('cuda')\n",
    "    target = target.to('cuda')\n",
    "    features = resnet_conv(data)\n",
    "    features = torch.squeeze(features)\n",
    "    features_test.append(features)\n",
    "    target_test.append(target)\n",
    "\n",
    "features_dset_test = torch.cat(features_test,0)\n",
    "target_dset_test = torch.cat(target_test, 0)\n",
    "\n",
    "print(features_dset_train.shape, target_dset_train.shape, features_dset_test.shape, target_dset_test.shape)\n",
    "\n",
    "torch.save(features_dset_train, 'cifar100_features_dataset/train.pt')\n",
    "torch.save(target_dset_train, 'cifar100_features_dataset/train_targets.pt')\n",
    "torch.save(features_dset_test, 'cifar100_features_dataset/test.pt')\n",
    "torch.save(target_dset_test, 'cifar100_features_dataset/test_targets.pt')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
